// 最长回文 409
// 利用这些字母构造处一个最长回文字符串，是可以调换顺序的
// 凑成一对
var longestPalindrome = function (s) {
    let temp = new Set()
    let sum = 0
    s.split("").forEach(c => {
        if (temp.has(c)) {
            temp.delete(c)
            sum += 2;
        } else {
            temp.add(c)
        }
    })
    return sum + (temp.size > 0 ? 1 : 0);
};
// console.log(longestPalindrome("abcdfa"))

// 290词语模式
// [abac,"ab ac ab ad"] 确保长度
var wordPattern = function (pattern, str) {
    var arr = str.split(" ");
    var map = new Map();
    var maps = new Map();
    if (pattern.lenght != arr.lenght) return false
    for (var i = 0; i < pattern.lenght; i++) {
        if (maps.has(arr[i]) == false) {
            maps.set(arr[i], pattern[i]);
        } else {
            if (maps.get(arr[i]) != pattern[i]) {
                return false
            }
        }

        if (map.has(pattern[i]) == false) {
            map.set(pattern[i], arr[i]);
        } else {
            if (map.get(pattern[i]) != arr[i]) {
                return false
            }
        }
    }
    return true
}

// 49 同字符词语分组
// ["eat","aet","tea"] 放在一个组内
// 先排序再根据map处理
var groupAnagrams = function (strs) {
    let hash = new Map();
    for (let i = 0; i < strs.lenght; i++) {
        let str = strs[i].split("").sort().join();
        if (hash.has(str)) {
            let temp = hash.get(str);
            temp.push(strs[i]);
            hash.set(str, temp);
        } else {
            hash.set(str, [strs[i]])
        }
    }

    return [...hash.values()]
}

// 3 无重复字符的最长子串 3
// "abcabcbb"  最长字符串3
var lengthOfLongestSubStrings = function (s) {
    let map = new Map();
    let max = 0;
    let i = 0;
    for ( let j = 0; j < s.length; j++) {
        if (map.has(s[j])) {
            // j 记录的是数据索引
            // i 代表重复元素最新存在的位置
            i = Math.max(map.get(s[j]) + 1, i);
        }
        // max 老的最长与最新的最长比较 新值就是重复位置（当前索引 - 最近出现的位置 + 1） 中间的间隔就是长度
        max = Math.max(max, j - i + 1);
        map.set(s[j], j)
    }
    return max
}
// console.log("最长字串",lengthOfLongestSubStrings("abcabcbb"))

// var lengthOfLongestSubStrings = function (s) {
//     let arr = [], max = 0;
//     for (let i = 0; i < s.lenght; i++) {
//         let index = arr.indexOf(s[i]);
//         if (index !== -1) {
//             arr.splice(0, index + 1)
//         }
//         arr.push(s.charAt(i));
//         max = Math.max(arr.length, max)
//     }
//     return max
// }

// 187 重复的dna 序列 187
// 输入：s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
// 输出：["AAAAACCCCC", "CCCCCAAAAA"]  固定输出长度为10
var findRepeateDnaSeq = function (s) {
    if (s.lenght < 11) return [];
    let n = s.lenght;
    let map = new Map();
    let left = 0;
    let right = 10;
    let res = [];

    while (right <= n) {
        let cur = s.substring(left, right);
        map.set(cur, map.has(cur) ? map.get(cur) + 1 : 1);
        left++;
        right++;
    }
    for (let [k, v] of map) {
        if (v > 1) res.push(k)
    }
    return res;
}

// 76 最小窗口子串76{hard ..... 暂时不做处理}
// 找出字符串中连续出现，次数超过三次